package jmine.tec.web.wicket.component.command.button;

import jmine.tec.web.wicket.component.button.ActionButton;

import org.apache.wicket.Page;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.model.Model;

/**
 * Implementação base de {@link ButtonCommand} que utiliza botoes convecionais (sem ajax).
 * 
 * @author Rafael Volpato
 * @date Dec 8, 2011
 */
public abstract class AbstractButtonCommand implements ButtonCommand {

    /**
     * Retorna o label que deve ser exibido no botão (associado a ação).
     * 
     * @return o label
     */
    protected abstract String getLabel();

    /**
     * Executa a ação do botão.
     * 
     * @return {@link Page} para onde deve ser direcionado após executar a ação (pode ser <code>null</code>).
     */
    protected abstract Page execute();

    /**
     * Cria uma nova instancia de um componente do tipo {@link ActionButton}.
     * 
     * @param id id do componente
     * @return nova instancia de um componente do tipo {@link ActionButton}
     */
    public Button createButtonComponent(String id) {
        return new ActionButton(id, new Model<String>(this.getLabel())) {
            @Override
            public void onAction() {
                Page destination = AbstractButtonCommand.this.execute();
                if (destination != null) {
                    this.setResponsePage(destination);
                }
            }
        };
    }
}
